﻿using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Text.Json;
using static System.Net.WebRequestMethods;

namespace DifyToOpenAI.Controllers
{

        [Authorize] // 需要认证的控制器或方法
        [ApiController]
        [Route("api/[controller]")] // 控制器的路由模板，將會是 /api/sse
        public class SseController : ControllerBase // 注意：继承自 ControllerBase 而不是 Controller
        {
            [ApiExplorerSettings(IgnoreApi = true)] /*控制是否在 Swagger 文档中显示此操作。*/
            // 定义 GET 请求的端点
            // 最终的 URL 将是 /api/sse/stream
            [HttpGet("stream")]
            public async Task GetSseStream()
            {
                // 在控制器中，可以直接通过 HttpContext 属性访问 Response 和 RequestAborted
              //  var response = HttpContext.Response;

                // 从当前 HTTP 请求中获取一个“取消令牌”。
                // 当客户端断开连接（如关闭浏览器）时，这个令牌会被自动触发。
                var cancellationToken = HttpContext.RequestAborted;

                // --- 以下的 SSE 逻辑与 Minimal API 版本完全相同 ---

                // 1. 设置 Response Header
                HttpContext.Response.Headers.ContentType = "text/event-stream";
                HttpContext.Response.Headers.CacheControl = "no-cache";
                HttpContext.Response.Headers.Connection = "keep-alive";

                try
                {
                    // 2. 循环推送数据
                    for (int i = 1; i <= 5; i++)
                    {
                        // 检查点：如果客户端已断开，就在这里抛出异常
                        cancellationToken.ThrowIfCancellationRequested();

                        var dataPayload = new
                        {
                            id = i,
                            message = $"来自 Controller 的第 {i} 条消息",
                            timestamp = DateTime.UtcNow.ToString("O")
                        };

                        // 构建 SSE 消息格式: "data: {json}\n\n"
                        string sseMessage = $"data: {JsonSerializer.Serialize(dataPayload)}\n\n";

                        // 将消息写入响应流
                        await HttpContext.Response.WriteAsync(sseMessage, cancellationToken);

                        // 非常重要：立即将数据推送到客户端
                        await HttpContext.Response.Body.FlushAsync(cancellationToken);

                        // 等待一秒再发送下一条
                        await Task.Delay(1000, cancellationToken);
                    }

                    // (可选) 发送一条结束消息
                    string completionMessage = "data: {\"message\": \"数据流结束\"}\n\n";
                    await HttpContext.Response.WriteAsync(completionMessage, cancellationToken);
                    await HttpContext.Response.Body.FlushAsync(cancellationToken);
                }
                catch (OperationCanceledException)
                {
                    // 当客户端断开连接时，这是预期的行为，可以记录日志
                    Console.WriteLine("客户端已断开连接 (Controller)。");
                }
                catch (Exception ex)
                {
                    // 处理其他可能的异常
                    Console.WriteLine($"发生错误 (Controller): {ex.Message}");
                }
            }
        }
  
}
